﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DAO;
using Entidad;



public partial class Restauracion : System.Web.UI.Page
{
    static int CodigoEjemplar;
    static int NumeroRestauracion;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CargarComboRestauradores();
            CargarComboTipo();
            btnActualizarDetalle.Enabled = false;
            if (int.TryParse(Request.QueryString["ejemplar"], out CodigoEjemplar))
            {
                if (string.Equals(Request.QueryString["numero"], "nueva"))
                {
                    Nueva();
                }
                else if (int.TryParse(Request.QueryString["numero"], out NumeroRestauracion))
                {
                    Actualizar();
                }
            }
            
        }
        
    }

    protected void Nueva()
    {
        Session["ListaDetalle"] = new List<DetalleRestauracionEnt>();
        RestauracionInterface iRestauracion = new RestauracionDAO();
        NumeroRestauracion = (int)iRestauracion.ObtenerNumeroUltima(CodigoEjemplar) + 1;
        txtNumero.Text = NumeroRestauracion.ToString();
        btnActualizar.Enabled = false;
        grvDetalleRestauracion.DataSource = new List<DetalleRestauracionEnt>();
        grvDetalleRestauracion.DataBind();
    }

    protected void Actualizar()
    {
        RestauracionInterface iRestauracion = new DetalleRestauracionDAO();
        List<DetalleRestauracionEnt> detalles = iRestauracion.ObtenerDetalles(NumeroRestauracion, CodigoEjemplar);
        Session["ListaDetalle"] = detalles;
        Session["ListaDetalleDAO"] = detalles;
        iRestauracion = new RestauracionDAO();
        RestauracionEnt restauracion = iRestauracion.ObtenerRestauracion(NumeroRestauracion, CodigoEjemplar);
        txtNumero.Text = restauracion.Numero.ToString();
        txtCosto.Text = decimal.Round(restauracion.Costo, 2).ToString();
        txtFechaInicio.Text = restauracion.FechaInicio.ToShortDateString();
        if (restauracion.FechaEntrega.HasValue)
        {
            txtFechaEntrega.Text = restauracion.FechaEntrega.Value.ToShortDateString();
        }
        cmbRestauradores.ClearSelection();
        cmbRestauradores.SelectedIndex = int.Parse(cmbRestauradores.Items.FindByValue(restauracion.IdRestaurador.ToString()).Value);
        CargarGrillaDetalle(detalles);
        btnRegistrar.Enabled = false;
        btnActualizar.Enabled = true;
    }

    protected void CargarComboRestauradores()
    {
        InformeRestauracionInterface iRestaurador = new RestauradorDAO();
        cmbRestauradores.DataSource = iRestaurador.BuscarRestauradores(null);
        cmbRestauradores.DataValueField = "id_Restaurador";
        cmbRestauradores.DataTextField = "datos";
        cmbRestauradores.DataBind();
        cmbRestauradores.Items.Insert(0, new ListItem(("Sin Seleccion"), ""));
        cmbRestauradores.SelectedIndex = 0;
    }

    protected void CargarComboTipo()
    {
        RestauracionInterface iRestauracion = new TipoRestauracionDAO();
        cmbTipoRestauracion.DataSource = iRestauracion.ObtenerTiposRestauracion();
        cmbTipoRestauracion.DataValueField = "ID_TipoRestauracion";
        cmbTipoRestauracion.DataTextField = "nombre";
        cmbTipoRestauracion.DataBind();
        cmbTipoRestauracion.Items.Insert(0, new ListItem(("Sin Seleccion"), ""));
        cmbTipoRestauracion.SelectedIndex = 0;
    }

    protected void CargarGrillaDetalle(List<DetalleRestauracionEnt> detalles)
    {
        grvDetalleRestauracion.DataSource = detalles;
        grvDetalleRestauracion.DataKeyNames = new String[] { "Id_DetalleRestauracion" };
        grvDetalleRestauracion.DataBind();
    }
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            if (!ComprobarExistenciaTipo())
            {
                List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
                DetalleRestauracionEnt nuevoDetalle = new DetalleRestauracionEnt();
                nuevoDetalle.Id_TipoRestauracion = int.Parse(cmbTipoRestauracion.SelectedItem.Value);
                nuevoDetalle.Id_Restauracion = NumeroRestauracion;
                nuevoDetalle.Costo = decimal.Parse(txtCostoDetalle.Text);
                if (!string.IsNullOrEmpty(txtDescripcionDetalle.Text))
                {
                    nuevoDetalle.Descripcion = txtDescripcionDetalle.Text;
                }
                nuevoDetalle.Tipo = cmbTipoRestauracion.SelectedItem.Text;
                detalles.Add(nuevoDetalle);
                CargarGrillaDetalle(detalles);
                txtCosto.Text = CalcularCostoTotal().ToString();
                BlanquearDetalle();
                btnActualizarDetalle.Enabled = false;
            }
        }
    }
    protected void btnRegistrar_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
            RestauracionInterface iRestauracion = new RestauracionDAO();
            RestauracionEnt restauracion = new RestauracionEnt();
            restauracion.Numero = int.Parse(txtNumero.Text);
            restauracion.IdEjemplar = ObtenerIDEjemplar();
            restauracion.IdRestaurador = int.Parse(cmbRestauradores.SelectedItem.Value);
            restauracion.FechaInicio = DateTime.Parse(txtFechaInicio.Text);
            if (!String.IsNullOrEmpty(txtFechaEntrega.Text))
            {
                restauracion.FechaEntrega = DateTime.Parse(txtFechaEntrega.Text);
            }
            restauracion.Costo = decimal.Parse(txtCosto.Text);
            if (!String.IsNullOrEmpty(txtDescripcion.Text))
            {
                restauracion.Descripcion = txtDescripcion.Text;
            }
            iRestauracion.GuardarRestauracion(restauracion, detalles);
        }
    }
    protected int ObtenerIDEjemplar()
    {
        int id_Ejemplar = 0;
        InformeRestauracionInterface iEjemplar = new EjemplarDAO();
        List<EjemplarEnt> ejemplares = iEjemplar.BuscarEjemplares(CodigoEjemplar);
        foreach (EjemplarEnt ejemplar in ejemplares)
        {
            id_Ejemplar = (int)ejemplar.ID_Ejemplar;
        }
        return id_Ejemplar;
    }
    protected decimal CalcularCostoTotal()
    {
        decimal costo = 0.0m;
        foreach (GridViewRow fila in grvDetalleRestauracion.Rows)
        {
            costo += decimal.Parse(fila.Cells[3].Text);
        }
        return costo;
    }
    protected void grvDetalleRestauracion_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
        detalles.RemoveAt(e.RowIndex);
        Session["ListaDetalle"] = detalles;
        CargarGrillaDetalle(detalles);
        BlanquearDetalle();
        txtCosto.Text = CalcularCostoTotal().ToString();
    }
    protected void btnActualizar_Click(object sender, EventArgs e)
    {
        RestauracionInterface iRestauracion = new DetalleRestauracionDAO();
        List<DetalleRestauracionEnt> DetallesPAG = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
        List<DetalleRestauracionEnt> DetallesDAO = iRestauracion.ObtenerDetalles(NumeroRestauracion, CodigoEjemplar);
        iRestauracion = new RestauracionDAO();
        RestauracionEnt restauracion = iRestauracion.ObtenerRestauracion(NumeroRestauracion, CodigoEjemplar);
        restauracion.FechaInicio = DateTime.Parse(txtFechaInicio.Text);
        if (!String.IsNullOrEmpty(txtFechaEntrega.Text))
        {
            restauracion.FechaEntrega = DateTime.Parse(txtFechaEntrega.Text);
        }
        else
        {
            restauracion.FechaEntrega = null;
        }
        restauracion.Costo = decimal.Parse(txtCosto.Text);
        restauracion.Descripcion = txtDescripcion.Text;
        List<DetalleRestauracionEnt> eliminar = null;
        List<DetalleRestauracionEnt> actualizar = null;
        List<DetalleRestauracionEnt> agregar = null;
        List<DetalleRestauracionEnt> nada = null;
        ObtenerAcciones(DetallesDAO, DetallesPAG,out actualizar, out eliminar, out nada, out agregar);

        iRestauracion.ActualizarRestauracion(restauracion,agregar,eliminar,actualizar);
    }
    protected void grvDetalleRestauracion_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
        DetalleRestauracionEnt detalle = detalles.ElementAt(e.NewSelectedIndex);
        cmbTipoRestauracion.ClearSelection();
        cmbTipoRestauracion.SelectedIndex = int.Parse(cmbTipoRestauracion.Items.FindByValue(detalle.Id_TipoRestauracion.ToString()).Value);
        txtCostoDetalle.Text = decimal.Round(detalle.Costo, 2).ToString();
        if (detalle.Descripcion != null)
        {
            txtDescripcionDetalle.Text = detalle.Descripcion;
        }
        btnAgregarDetalle.Enabled = false;
        btnActualizarDetalle.Enabled = true;
        ViewState["IndiceDetalleSeleccionado"] = e.NewSelectedIndex;
        ViewState["TipoSeleccionado"] = cmbTipoRestauracion.SelectedIndex;
        ViewState["id_DetalleRestauracion"] = detalle.Id_DetalleRestauracion;
    }
    protected void BlanquearDetalle()
    {
        cmbTipoRestauracion.ClearSelection();
        txtCostoDetalle.Text = "";
        btnAgregarDetalle.Enabled = true;
        btnActualizarDetalle.Enabled = false;
    }
    protected void grvDetalleRestauracion_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
        GridView nueva = (GridView)sender;
        nueva.PageIndex = e.NewPageIndex;
        CargarGrillaDetalle(detalles);
    }
    protected bool ComprobarExistenciaTipo()
    {
        bool bandera = false;
        if (ViewState["TipoSeleccionado"] != null)
        {
            if ((int)ViewState["TipoSeleccionado"] == cmbTipoRestauracion.SelectedIndex)
            {
                bandera = false;
            }
            else
            {
                foreach (GridViewRow fila in grvDetalleRestauracion.Rows)
                {
                    if (fila.Cells[2].Text == cmbTipoRestauracion.SelectedItem.Text)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "alerta()", "alerta()", true);
                        bandera = true;
                    }
                }
            }
        }
        else
        {
            foreach (GridViewRow fila in grvDetalleRestauracion.Rows)
            {
                if (fila.Cells[2].Text == cmbTipoRestauracion.SelectedItem.Text)
                {
                    ClientScript.RegisterStartupScript(GetType(), "alerta()", "alerta()", true);
                    bandera = true;
                }
            }
        }
        return bandera;
    }
    protected void btnActualizarDetalle_Click(object sender, EventArgs e)
    {

        if (IsValid)
        {
            if (!ComprobarExistenciaTipo())
            {
                List<DetalleRestauracionEnt> detalles = (List<DetalleRestauracionEnt>)Session["ListaDetalle"];
                int indice = (int)ViewState["IndiceDetalleSeleccionado"];
                DetalleRestauracionEnt nuevoDetalle = new DetalleRestauracionEnt();
                nuevoDetalle.Id_DetalleRestauracion = (int)ViewState["id_DetalleRestauracion"];
                nuevoDetalle.Id_TipoRestauracion = int.Parse(cmbTipoRestauracion.SelectedItem.Value);
                nuevoDetalle.Id_Restauracion = NumeroRestauracion;
                nuevoDetalle.Costo = decimal.Parse(txtCostoDetalle.Text);
                if (!string.IsNullOrEmpty(txtDescripcionDetalle.Text))
                {
                    nuevoDetalle.Descripcion = txtDescripcionDetalle.Text;
                }
                nuevoDetalle.Tipo = cmbTipoRestauracion.SelectedItem.Text;
                detalles.RemoveAt(indice);
                detalles.Insert(indice, nuevoDetalle);
                CargarGrillaDetalle(detalles);
                txtCosto.Text = CalcularCostoTotal().ToString();
            }
            BlanquearDetalle();
            btnActualizarDetalle.Enabled = false;
            ViewState["TipoSeleccionado"] = null;
            ViewState["id_DetalleRestauracion"] = null;
        }

    }

    protected void ObtenerAcciones(List<DetalleRestauracionEnt> DetallesDAO, List<DetalleRestauracionEnt> DetallesPAG, 
        out List<DetalleRestauracionEnt> actualizar, out List<DetalleRestauracionEnt> eliminar, out List<DetalleRestauracionEnt> nada, out List<DetalleRestauracionEnt> agregar)
    {
        
        eliminar = new List<DetalleRestauracionEnt>();
        actualizar = new List<DetalleRestauracionEnt>();
        nada = new List<DetalleRestauracionEnt>();
        agregar = new List<DetalleRestauracionEnt>();
        foreach(DetalleRestauracionEnt pag in DetallesPAG)
        {
            if (!pag.Id_DetalleRestauracion.HasValue)
            {
                agregar.Add(pag);
            }
            else
            {
                foreach (DetalleRestauracionEnt dao in DetallesDAO)
                {
                    if (dao.Id_DetalleRestauracion == pag.Id_DetalleRestauracion)
                    {
                        if (dao.IsEqual(pag))
                        {
                            nada.Add(pag);
                        }
                        else
                        {
                            actualizar.Add(pag);
                        }
                    }
                }
            }
        }
        foreach (DetalleRestauracionEnt dao in DetallesDAO)
        {
            if (!VerificarEliminar(dao, DetallesPAG))
            {
                eliminar.Add(dao);
            }
        }
    }

    protected bool VerificarEliminar(DetalleRestauracionEnt detalleDAO, List<DetalleRestauracionEnt> DetallesPAG)
    {
        bool bandera = false;
        foreach (DetalleRestauracionEnt detalle in DetallesPAG)
        {
            if (detalleDAO.Id_DetalleRestauracion == detalle.Id_DetalleRestauracion)
            {
                bandera = true;
                break;
            }
        }
        return bandera;
    }
    protected void btnNuevoDetalle_Click(object sender, EventArgs e)
    {
        BlanquearDetalle();
    }
}